上篇文章提到的查詢模組,從 dir(agentdojo.benchmark) 的輸出可以看到,這個模組匯集了任務執行函式、結果資料結構、序列化工具,以及多種例外處理類別。
run_task_without_injection_tasks 是最基礎的單位操作,用來在「沒有任何提示注入攻擊」的乾淨環境下,執行單一使用者任務或注入任務,藉此單純測量代理人管線完成任務的能力(utility)。它會回傳一個 (utility, security) 的布林值元組,由於沒有攻擊介入,security 永遠為 True。函式內部還內建了針對 BadRequestError(例如上下文長度超限)、ApiError、ServerError 等常見 API 例外的容錯處理,避免單一任務失敗導致整個評測中斷。
run_task_with_injection_tasks 則是加入了攻擊維度:它會針對指定的使用者任務,套用某個 BaseAttack 攻擊實例,將惡意指令注入環境資料中,再觀察代理人是否被誤導去執行注入任務的目標,而非完成原本的使用者任務。此函式會針對套件中每一個注入任務(injection task)分別執行一次,最終回傳兩份以「(使用者任務ID, 注入任務ID)」為鍵值的字典:一份記錄任務是否仍被正確完成(utility),另一份記錄代理人是否成功抵禦了攻擊(security)。
在這兩個「單一任務」函式之上,benchmark_suite_without_injections 與 benchmark_suite_with_injections 則負責將整個任務套件(TaskSuite)跑過一遍。前者僅用來測量代理人在沒有攻擊時的整體任務完成率,後者則會先驗證所有注入任務本身是否可作為一般使用者任務被正確解決(若否會發出警告),接著遍歷每個使用者任務、套用攻擊,最後彙整成套件層級的整體結果。這兩個函式都支援 logdir 參數,可將每次執行的過程記錄下來,並透過 force_rerun 參數決定是否略過已有記錄的任務,達到斷點續跑的效果。
SuiteResults執行完一整個套件後,結果會被封裝成 SuiteResults 這個 TypedDict,包含utility_results(組合的完成率)、security_results(組合是否防禦攻擊成功)、以及 injection_tasks_utility_results(各注入任務單獨作為使用者任務時的完成率)。這種以元組為鍵的字典設計,讓研究者可以精細地交叉分析「哪一種使用者任務」搭配「哪一種攻擊目標」時最容易被攻破,而不只是看到一個籠統的平均分數。
TaskSuite、BaseUserTask、BaseInjectionTask:分別代表任務套件本身,以及使用者任務、注入任務的抽象基底類別,開發者可繼承後客製化自己的評測情境。BasePipelineElement、BaseModel:代理人管線與其資料模型的基礎介面,讓不同 LLM 供應商或防禦策略都能以統一方式接入。BaseAttack:所有攻擊策略的基底類別,is_dos_attack 屬性可用來判斷該攻擊是否屬於「阻斷服務型」攻擊(此類攻擊不在乎具體注入目標,因此執行邏輯略有不同)。TraceLogger、Logger、ConfigDict:負責記錄每次任務執行過程中的訊息軌跡(trace),方便事後除錯與結果重現。ApiError、BadRequestError、ServerError、UnprocessableEntityError、ValidationError:涵蓋了呼叫外部 LLM API 時可能出現的各種錯誤情境,確保評測腳本在大規模跑分時具備足夠的韌性。模組也提供了幾個實用函式,方便處理已產生的評測紀錄,load_task_results 與 load_suite_results 可從指定的 logdir 中讀回先前執行過的單一任務或整套任務結果,這也是 force_rerun=False 時判斷是否需要「跳過已完成任務」的依據,aggregate_results 則用來將多次執行或多個套件的結果彙整為統整後的統計數據,convert_old_messages_format 這類轉換工具,則反映出專案在版本迭代過程中,對訊息格式(如工具呼叫格式)做過調整,並提供了向下相容的能力。此外 get_suite 函式可依名稱快速取得已註冊的任務套件實例。